﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AllInOne.Dados;
using AllInOne.Util;

namespace AllInOne.Negocio
{
    /// <summary>
    /// Classe para abstração da interação com o banco de dados
    /// </summary>
    class NegocioCliente : Negocio<Cliente>
    {
        #region Negocio<Cliente> Constructor
        public NegocioCliente()
        {

        }
        #endregion

        #region Negocio<Cliente> Members

        /// <summary>
        /// Persiste um objeto 'Cliente'
        /// </summary>
        /// <param name="objeto">Cliente a ser persistido</param>
        /// <returns>ID do cliente persistido</returns>
        public int adicionar(Cliente objeto)
        {
            int retorno = -1;

            try
            {
                using (ModeloDadosContainer mdc = new ModeloDadosContainer())
                {
                    mdc.AddToClienteSet(objeto);
                    int result = mdc.SaveChanges();

                    if (result > 0)
                        retorno = objeto.Id;
                }
            }
            catch (Exception e)
            {
                ExceptionUtil.TratarExcecao(e);
            }
            return retorno;
        }

        /// <summary>
        /// Atualiza um cliente, caso esteja atualmente persistido
        /// </summary>
        /// <param name="objeto">Cliente a atualizar no banco de dados</param>
        /// <returns><code>true</code>- Atualizado com sucesso, <code>false</code>- Erro ao persistir</returns>
        public bool atualizar(Cliente objeto)
        {
            bool retorno = false;

            using (ModeloDadosContainer mdc = new ModeloDadosContainer())
            {
                Object original;

                if (mdc.TryGetObjectByKey(objeto.EntityKey, out original))
                {
                    mdc.ApplyCurrentValues(objeto.EntityKey.EntitySetName, objeto);
                }

                int result = mdc.SaveChanges();

                if (result > 0)
                    retorno = true;
            }
            return retorno;
        }


        /// <summary>
        /// Exclui um cliente do banco de dados
        /// </summary>
        /// <param name="objeto">Cliente a excluir</param>
        /// <returns><code>true</code>- Excluído com sucesso, <code>false</code>- Erro ao exlcuir</returns>
        public bool remover(Cliente objeto)
        {
            bool retorno = false;

            using (ModeloDadosContainer mdc = new ModeloDadosContainer())
            {
                Cliente tmp = mdc.ClienteSet.First<Cliente>(cliente => cliente.Id == objeto.Id);

                if (tmp != null)
                {
                    mdc.ClienteSet.DeleteObject(tmp);
                    int result = mdc.SaveChanges();

                    if (result > 0)
                        return true;
                }
            }
            return retorno;
        }


        /// <summary>
        /// Recupera a lista de Clientes atualmente persistidos
        /// </summary>
        /// <returns>Clientes atualmente persistidos no banco de dados</returns>
        public List<Cliente> pesquisar()
        {
            List<Cliente> retorno = null;

            try
            {
                using (ModeloDadosContainer mdc = new ModeloDadosContainer())
                {
                    retorno = mdc.ClienteSet.ToList<Cliente>();
                }
            }
            catch (Exception e)
            {
                ExceptionUtil.TratarExcecao(e);
            }

            return retorno;
        }


        /// <summary>
        /// Retorna o Cliente com o ID especifidado
        /// </summary>
        /// <param name="id">ID para pesquisa</param>
        /// <returns><code>Servico</code> localizado ou <code>null</code> caso não localizado</returns>
        public Cliente pesquisar(int id)
        {
            Cliente retorno = null;

            try
            {
                using (ModeloDadosContainer mdc = new ModeloDadosContainer())
                {
                    retorno = mdc.ClienteSet.First<Cliente>(cliente => cliente.Id == id);
                }
            }
            catch (Exception e)
            {
                ExceptionUtil.TratarExcecao(e);
            }

            return retorno;
        }

        #endregion
    }
}
